﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Collections;

namespace distrilan
{
  /// <summary>
  /// Gestisce la parte di caricamento dei filtri degli articoli
  /// </summary>
  public class AdminCsvPromo
  {
    /// <summary>
    /// Funzione principale caricamento filtri
    /// </summary>
    /// <param name="fileName"></param>
    /// <returns></returns>
    static public String CaricamentoPromozioni(String fileName)
    {      
      String output = "";
      ArrayList arrText = AdminUtility.LeggiFile(fileName,out output );
      if (arrText.Count > 0)
      {
        ListaPromozioni(arrText, ref output);
        output += "Caricamento Avvenuto con successo!";
      }
      
      return output;
    }


    /// <summary>
    /// carica le promozioni
    /// </summary>
    /// <param name="lista"></param>
    /// <param name="output"></param>
    static private void ListaPromozioni(ArrayList lista, ref String output)
    {      
      int count = 0;
      int riga = 0;
      String query = "";
      // Apro la connessione al DB
      SqlConnection connection = new SqlConnection(Utility.GetDBConnectionString());
      SqlTransaction tr = null;
      SqlCommand cmd = null;
      try
      {
        // Elimino il primo elemento che rappresenta le prime colonne
        lista.RemoveAt(0);
        
        // Do inzio alla transazione
        connection.Open();
        tr = connection.BeginTransaction();
        // Elimino tutti i filtri precedentemente caricati
        query = "DELETE FROM promozioni";
        cmd = new SqlCommand(query, connection);
        cmd.Transaction = tr;
        cmd.ExecuteNonQuery();
        
        foreach (String str in lista)
        {
          // Incremento il numero di riga
          riga++;
          // Spezzo il listato in campi
          String[] campi = str.Split(new char[] { ';' });
          
          // Verifico che i campi siano 3 ossia codice articolo, prezzo, codice cliente
          if (campi.Length != 3)
          {
            Utility.WriteLog("ERRORE", "ListaPromozioni", "Riga " + riga + ":la struttura della riga è errata", SiteUser.getUser().Username, str);
            output += "Si è verificato un errore durante l'elaborazione della riga " + riga + ": la struttura della riga e' errata\n";
            continue;
          }

          // Tolgo spazi e apici
          for (int i = 0; i < campi.Length; i++)          
            campi[i] = campi[i].Replace("'", "''").Trim();          

          // Controllo che i dati siano corretti
          if (campi[0] == "" || campi[1] == "" || campi[2] == "")
          {
            Utility.WriteLog("ERRORE", "ListaPromozioni", "Riga " + riga + ":Tutti i campi devono essere valorizzati", SiteUser.getUser().Username, str);
            output += "Si è verificato un errore durante l'elaborazione della riga " + riga + ": Tutti i campi devono essere valorizzati\n";
            continue;
          }                 

          // Controllo che il prezzo inserito sia corretto
          String prezzo = "0.0";
          try
          {
            prezzo = Utility.GetDoubleForDB(Convert.ToDouble(campi[2]));
          }
          catch (Exception)
          {
            Utility.WriteLog("ERRORE", "ListaPromozioni", "La riga " + riga + " ha il prezzo scritto in modo errato", SiteUser.getUser().Username, "");
            output += "ERRORE: La riga " + riga + " ha il prezzo scritto in modo errato\n";
            continue;
          }
         
          // Ora scrivo l'articolo riga nel database
          query = "INSERT INTO promozioni(catpromo,codart,prezzo) VALUES (";
          query += "" + campi[0] + ",'" + campi[1] + "'," + prezzo + ")";
          
          cmd = new SqlCommand(query, connection);
          cmd.Transaction = tr;
          try
          {
            cmd.ExecuteNonQuery();
          }
          catch (SqlException sqlex)
          {
            if (sqlex.Message.Contains("Violation of PRIMARY KEY constraint"))
            {
              Utility.WriteLog("ERRORE", "ListaPromozioni", "Riga " + riga + ":Codice promozione duplicato", SiteUser.getUser().Username, str);
              output += "Si è verificato un errore durante l'elaborazione della riga " + riga + " del file promozioni: Codice promozione duplicato\n";
              continue;
            }
            throw sqlex;
          }         

          count++;
        }

        if (count > 0)
        {
          output += "Caricate " + count + " righe di promozioni\n";
          tr.Commit();
        }
        else
        {
          output += "Non è stata individuata alcuna riga valida nel file";          
          throw new Exception("Nessuna Riga Valida nel file!");
        }        
        
      }
      catch (Exception ex)
      {
        if (tr != null) tr.Rollback();
        Utility.WriteLog("ERRORE", "ListaPromozioni", ex.Message, SiteUser.getUser().Username, "");
        output += "Si è verificato un errore irreversibile durante l'elaborazione della riga " + riga + "\n";
        throw ex;
      }
      finally
      {
        connection.Close();
      }      
    }

  }
}
